another use of potentially invalid waypt field. (#974)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Fri, 6 Jan 2023 17:05:50 +0000 (10:05 -0700)
committerGitHub <noreply@github.com>
Fri, 6 Jan 2023 17:05:50 +0000 (10:05 -0700)
* another use of potentially invalid waypt field.

* fix erroneous comparison of optional waypt values.

defs.h
gtrnctr.cc
trackfilter.cc

diff --git a/defs.h b/defs.h
index 0b50d1f951d1df130bf9d788b4ed11651c54fca5..e159b431944f93837e59ff0f3b66f5b91246fb9c 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -323,6 +323,9 @@ struct bounds {
 #define WAYPT_GET(wpt,member,def) (((wpt)->wpt_flags.member) ? ((wpt)->member) : (def))
 #define WAYPT_UNSET(wpt,member) wpt->wpt_flags.member = 0
 #define WAYPT_HAS(wpt,member) ((wpt)->wpt_flags.member)
+#define WAYPT_EQUAL(wpta,wptb,member) (((wpta)->wpt_flags.member && (wptb)->wpt_flags.member && \
+                                        ((wpta)->member == (wptb)->member)) || \
+                                       (!(wpta)->wpt_flags.member && !(wptb)->wpt_flags.member))
 
 /*
  * This is a waypoint, as stored in the GPSR.   It tries to not
index 81f1dcee673e288ab357d3841ff92f057169d887..b9ff1b81610abb23f3bd3e6bfdf3812b6df25db9 100644 (file)
@@ -192,11 +192,11 @@ GtrnctrFormat::gtc_waypt_pr(const Waypoint* wpt)
   if (wpt->cadence) {
     gtc_write_xml(0, "<Cadence>%d</Cadence>\n", wpt->cadence);
   }
-  if (wpt->speed || wpt->power) {
+  if (WAYPT_HAS(wpt, speed) || wpt->power) {
     gtc_write_xml(1, "<Extensions>\n");
     gtc_write_xml(1, "<TPX xmlns=\"http://www.garmin.com/xmlschemas/ActivityExtension/v2\">\n");
     /* see http://www8.garmin.com/xmlschemas/ActivityExtensionv2.xsd */
-    if (wpt->speed) {
+    if (WAYPT_HAS(wpt, speed)) {
       gtc_write_xml(0, "<Speed>%.3f</Speed>\n", wpt->speed);
     }
     if (wpt->power) {
index f60371f26bbf0ad03e7c04c9ef099db273bc060a..4482afe3508fd7a1e146b13d84cac733efd6b414 100644 (file)
@@ -903,12 +903,11 @@ bool TrackFilter::trackfilter_points_are_same(const Waypoint* wpta, const Waypoi
     std::abs(wpta->latitude - wptb->latitude) < .00001 &&
     std::abs(wpta->longitude - wptb->longitude) < .00001 &&
     std::abs(wpta->altitude - wptb->altitude) < 20 &&
-    (WAYPT_HAS(wpta,course) == WAYPT_HAS(wptb,course)) &&
-    (wpta->course == wptb->course) &&
-    (wpta->speed == wptb->speed) &&
+    WAYPT_EQUAL(wpta, wptb, course) &&
+    WAYPT_EQUAL(wpta, wptb, speed) &&
     (wpta->heartrate == wptb->heartrate) &&
     (wpta->cadence == wptb->cadence) &&
-    (wpta->temperature == wptb->temperature);
+    WAYPT_EQUAL(wpta, wptb, temperature);
 }
 
 void TrackFilter::trackfilter_segment_head(const route_head* rte)